package com.sophossystems.client.asmon.action;

import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;

import org.apache.log4j.Logger;
import org.jfree.util.Log;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sophossystems.client.asmon.dto.ClienteDTO;
import com.sophossystems.client.asmon.dto.ClientePMoralesDTO;
import com.sophossystems.client.asmon.dto.ClientePersonasFisicasDTO;
import com.sophossystems.client.asmon.model.Busqueda;
import com.sophossystems.client.asmon.model.PersonaFisica;
import com.sophossystems.client.asmon.service.ClientService;
import com.sophossystems.client.asmon.service.SearchService;

public class SearchAction extends ActionSupport implements
		ModelDriven<Busqueda> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static Logger logger = Logger.getLogger(SearchAction.class);
	private SearchService searchService;
	private Busqueda busqueda;

	private HashMap<String, String> listaFisicas = new HashMap<String, String>();
	private HashMap<String, String> listaMorales = new HashMap<String, String>();
	private HashMap<String, String> listaFisicasCliente = new HashMap<String, String>();
	private HashMap<String, String> listaMoralesCliente = new HashMap<String, String>();
	
	private List<ClientePMoralesDTO> listaClienteMorales = null;
	private List<ClientePersonasFisicasDTO> listaClienteFisicas = null;

	private void springRegistro() {
		logger.debug("En la context Clientes");

		XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource(
				"applicationContext.xml"));
		searchService = (SearchService) bf.getBean("searchService");
	}

	public String busquedaRfc() {
		this.springRegistro();
		String resultado = "";
		ClienteDTO clienteEncontrado = null;
		ClientePersonasFisicasDTO personaF = null;
		ClientePMoralesDTO personaM = null;
		ClienteDTO detalleCliente = busqueda.mapper();
		try {
			clienteEncontrado = searchService.buscarRfc(detalleCliente);
		} catch (Exception e) {
			Log.error("fallo la busqueda del cliete en action, causa: "
					+ e.getCause());
		}
		if (clienteEncontrado != null) {
			try {
				personaF = searchService.detalleFisica(clienteEncontrado);
			} catch (Exception e) {
				Log.error("falla al buscar detalle en persona fisica, causa: "
						+ e.getCause());
			}
			try {
				personaM = searchService.detalleMoral(clienteEncontrado);
			} catch (Exception e) {
				Log.error("falla al buscar detalle en persona moral, causa: "
						+ e.getCause());
			}
		}
		if (clienteEncontrado != null
				&& clienteEncontrado.getIdTipoCliente() == 1
				&& personaF != null) {
			busqueda.setEncontrado(true);
			busqueda.setSeleccion(0);
			busqueda.setNombrePersonaFisica(personaF.getaPaterno() + " "
					+ personaF.getaMaterno() + " " + personaF.getNombres());
			busqueda.unmapper(clienteEncontrado);
			resultado = SUCCESS;
		} else if (clienteEncontrado != null
				&& clienteEncontrado.getIdTipoCliente() == 2
				&& personaM != null) {
			busqueda.setEncontrado(true);
			busqueda.setSeleccion(0);
			busqueda.setRazonSocialPersonaMoral(personaM.getRazonSocial());
			busqueda.unmapper(clienteEncontrado);
			resultado = SUCCESS;
		} else {
			busqueda.clean();
			busqueda.setEncontrado(false);
			resultado = ERROR;
		}
		return resultado;

	}

	public String busquedaPalabra() {
		this.springRegistro();
		String resultado = "";

		// busca clientes personas morales
		try {
			listaClienteMorales = searchService
					.buscarPorPalabraMorales(busqueda.getPalabraBusqueda());
		} catch (Exception e) {
			Log.error("error en busqueda por palabra persona moral, search action"
					+ e.getCause());
		}
		// busca clientes perosnas fisicas
		try {
			listaClienteFisicas = searchService
					.buscarPorPalabraFisicas(busqueda.getPalabraBusqueda());
		} catch (Exception e) {
			Log.error("error en busqueda por palabra persona fisica, search action"
					+ e.getCause());
		}

		// llena los hashMap
		for (ClientePersonasFisicasDTO clienteFisicas : listaClienteFisicas) {
			listaFisicas.put(
					clienteFisicas.getClientedto().getRfc(),
					clienteFisicas.getaPaterno() + " " + " "
							+ clienteFisicas.getaMaterno() + " "
							+ clienteFisicas.getNombres());
		}

		for (ClientePMoralesDTO clienteMorales : listaClienteMorales) {
			listaMorales.put(clienteMorales.getCliente().getRfc(),
					clienteMorales.getRazonSocial());
		}

		if (listaClienteFisicas.size() > 0 || listaClienteMorales.size() > 0) {
			busqueda.setEncontrado(true);
			busqueda.setSeleccion(1);
			busqueda.setListaFisicas(listaFisicas);
			busqueda.setListaMorales(listaMorales);
			resultado = SUCCESS;
		} else {
			busqueda.clean();
			busqueda.setEncontrado(false);
			resultado = ERROR;
		}

		return resultado;

	}

	public String busquedaContador() {
		this.springRegistro();
		String resultado = "";
		List<ClienteDTO> listaClientes = null;
		try {
			listaClientes = searchService.buscarPorContador(busqueda
					.getIdContadorAsig());
		} catch (Exception e) {
			Log.error("error en busqueda por contador, causa: " + e.getCause());
		}
		listaClienteFisicas = new ArrayList<ClientePersonasFisicasDTO>();
		listaClienteMorales = new ArrayList<ClientePMoralesDTO>();
		int contadorFisicas = 0;
		int contadorMorales= 0;
		for (ClienteDTO clienteDTO : listaClientes) {
			System.out.println("contador fisicas: " + contadorFisicas);
			if (clienteDTO.getIdTipoCliente() == 1) {
				try {
					listaClienteFisicas.add(searchService
							.detalleFisica(clienteDTO));
					listaClienteFisicas.get(contadorFisicas).setClientedto(clienteDTO);
				} catch (Exception e) {
					Log.error("error en busqueda por contador, detalle fisica, causa: "
							+ e.getCause());
				}
				contadorFisicas++;
			} else if (clienteDTO.getIdTipoCliente() == 2) {
				System.out.println("contador morales: " + contadorMorales);
				try {
					listaClienteMorales.add(searchService
							.detalleMoral(clienteDTO));
					listaClienteMorales.get(contadorMorales).setCliente(clienteDTO);
				} catch (Exception e) {
					Log.error("error en busqueda por contador, detalle moral, causa: "
							+ e.getCause());
				}
				contadorMorales++;

			}
		}
		
		// llena los hashMap
		for (ClientePersonasFisicasDTO clienteFisicas : listaClienteFisicas) {
			listaFisicasCliente.put(
					clienteFisicas.getClientedto().getRfc(),
					clienteFisicas.getaPaterno() + " " + " "
							+ clienteFisicas.getaMaterno() + " "
							+ clienteFisicas.getNombres());
		}

		for (ClientePMoralesDTO clienteMorales : listaClienteMorales) {
			listaMoralesCliente.put(clienteMorales.getCliente().getRfc(),
					clienteMorales.getRazonSocial());
		}

		if (listaClienteFisicas.size() > 0 || listaClienteMorales.size() > 0) {
			busqueda.setEncontrado(true);
			busqueda.setSeleccion(2);
			busqueda.setListaFisicasCliente(listaFisicasCliente);
			busqueda.setListaMoralesCliente(listaMoralesCliente);
			resultado = SUCCESS;
		} else {
			busqueda.clean();
			busqueda.setEncontrado(false);
			resultado = ERROR;
		}

		return resultado;
	}

	public SearchAction() {
		busqueda = new Busqueda();
	}

	@Override
	public Busqueda getModel() {
		return busqueda;
	}

}
